package com.xiongjie.SingleLimit.algorithm;

/**
 * 使用令牌桶算法实现限流功能。算法伪代码
 *
 * 推荐组合：并发队列做令牌桶 + 定时任务自动添加令牌到令牌桶+RateLimiter。
 */
public class TBLimiterWithPseudocode{

    long timeStamp=System.currentTimeMillis();
    int capacity=100; // 桶的容量
    int rate=10 ; //令牌放入速度
    int tokens; //当前水量

    boolean grant() {
        //先执行添加令牌的操作
        long now = System.currentTimeMillis();
        tokens = (int) Math.min(capacity, tokens + (now - timeStamp) * rate);   //这里的token令牌会在用户点击不断减少，代码看不出来
        timeStamp = now;

        if(tokens<1){
            //令牌已用完，拒绝访问
            return false;
        }else{
            //还有令牌，领取令牌
            tokens--;

            //TODO 执行请求后续操作

            return true;
        }
    }

}
